package zuoye7;

import zuoye6.ServerThread;

import java.io.*;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ServerThread1 extends Thread{
    Socket lssocket=null;
    List<Socket> socketList= null;
    Socket s=null; //保存与本线程相关的Socket对象
    public ServerThread1(Socket s, List<Socket> socketList) { //构造函数
        //这个才是本身线程
        this.s=s; //初始化socket变量
        //这里的P并不是自身客户端，而是要发送的目标客户端
        this.socketList = socketList;//记录传进来的整个线程
    }
    public void run() { //线程主体
        try{
            String line;
            //消息，文件输入流
            DataInputStream is=new DataInputStream(s.getInputStream());

            while(true){
                if(is.available()>0)
                {
                    //获取客户端发来的信息
                    line=is.readUTF();//读取字符串，格式example: 1 aaa
                    System.out.println(line);
                    ArrayList<Socket> innerArr = new ArrayList<>();
                    for (Socket socket:socketList) {
                        if (s!=socket) {
                            innerArr.add(socket);
                        }
                    }

                    //这边获取的就是文件或者文字了
                    //int number = Integer.parseInt(talk[0]);//这是要收消息的客户端的编号，现在这里要改成向所有的客户端发送信息
                    //这里因为转发的时候不能向自己转发，转发了会出现问题
//                    for (int i=0;i<socketList.size();i++) {
//                        if (socketList.get(i)!=s) {
//                            innerSocketList.add(socketList.get(i));
//                        }
//                    }
                    //lssocket=MultiTalkServer.socket[number];//方便修改os，这里是获取要发送到的客户端
                    //客户端输出流，现在这里要改成向所有的客户端发送信息
                    //DataOutputStream os=new DataOutputStream(lssocket.getOutputStream());//消息，文件输出流
                    //这里是如果不是发送文件，则发送聊天信息，哪个客户端说了什么话
                    //这里需要写成将信息传给所有在线的客户端，我需要获取除了自己之外所有的客户端，那我们已经将整个
                    //数组传进来了，相当于我们再新创一个数组，将当前数组排除出去就好
                    //os.writeUTF(line);//向客户端输出该字符串
                    //os.flush();//刷新输出流，使Client马上收到该字符串
                    //这里是判断是不是发送的文件，发送文件是有.的，以此为判断分割的话，字符串数组的长度会大于1
                    DataOutputStream dos = new DataOutputStream(s.getOutputStream());
                    dos.writeUTF(line);//向客户端输出该字符串
                    dos.flush();//刷新输出流，使Client马上收到该字符串
                    if(line.contains(":")&&line.contains(".")&&line.contains(File.separator))//如果要发文件
                    {
                        int n=512,len=512;
                        byte[] data = new byte[n];//一次读取字节,一般不会太大
                        while(len>=n)
                        {
                            len=is.read(data,0,n);
                            dos.write(data,0,len);
                            dos.flush();
                        }
                    }
                    else
                    {
                        if (line.equals("bye")) {
                            System.out.println("客户 "+s.getPort()+" 已退出系统!");
                            break;
                        }else {
                            for (Socket s : innerArr) {
                                    dos = new DataOutputStream(s.getOutputStream());
                                    dos.writeUTF(line);
                                    dos.flush();

                            }
                        }
                    }
                }
            }
            is.close(); //关闭Socket输入流
            s.close(); //关闭Socket
        }catch(Exception e){
            System.out.println("Error:"+e);//出错，打印出错信息
        }
    }
}

